// import 'package:dio/dio.dart';
// import 'package:god_logistics/utils/eventbus.dart';
// import 'package:god_logistics/utils/showToast.dart';
// import 'package:god_logistics/utils/tokenManage.dart';

// class NetworkService {
//   final _dio = Dio();

//   NetworkService() {
//     // 配置基础地址
//     _dio.options.baseUrl = 'https://slwl-api.itheima.net';
//     // 设置连接超时时间
//     _dio.options.connectTimeout = const Duration(seconds: 5);
//     // 设置接收超时时间
//     _dio.options.receiveTimeout = const Duration(seconds: 5);
//     // 设置请求头
//     _dio.options.headers = {'Content-Type': 'application/json'};
//     // 添加请求和响应拦截器
//     _addInterceptors();
//   }

//   // /**
//   //  * 发起GET请求
//   //  * [url] 请求的URL
//   //  * [params] 请求的查询参数
//   //  * 返回解析后的响应数据或错误信息
//   //  */
//   Future<dynamic> get(String url, {Map<String, dynamic>? params}) async {
//     try {
//       final response = await _dio.get(url, queryParameters: params);
//       return handleResponse(response);
//     } catch (e) {
//       return handleError(e);
//     }
//   }

//   // /**
//   //  * 发起POST请求
//   //  * [url] 请求的URL
//   //  * [data] 请求的主体数据
//   //  * 返回解析后的响应数据或错误信息
//   //  */
//   Future<dynamic> post(String url, dynamic data) async {
//     try {
//       final response = await _dio.post(url, data: data);
//       return handleResponse(response);
//     } catch (e) {
//       return handleError(e);
//     }
//   }

//   Future<dynamic> delete(String url) async {
//     try {
//       final response = await _dio.delete(url);
//       return handleResponse(response);
//     } catch (e) {
//       return handleError(e);
//     }
//   }

//   // 其他 HTTP 方法封装...

//   void _addInterceptors() {
//     _dio.interceptors.add(
//       InterceptorsWrapper(
//         onRequest: (options, handler) async {
//           // 请求拦截器：添加公共请求参数、token 等
//           // todo
//           final tokenManager = TokenManager();
//           tokenManager.init();
//           final token = TokenManager().getToken() ?? '';
//           ToastUtil.showInfo('是否携带token ${token}');
//           if (token != '') {
//             options.headers['Authorization'] = 'Bearer $token';
//           } else {
//             ToastUtil.showInfo('未携带token');
//           }
//           return handler.next(options);
//         },
//         onResponse: (response, handler) {
//           // 响应拦截器：统一处理成功响应
//           return handler.next(response);
//         },
//         onError: (DioException error, handler) {
//           // 响应拦截器：统一处理错误响应
//           return handler.next(error);
//         },
//       ),
//     );
//   }

//   dynamic handleResponse(Response response) {
//     if (response.statusCode! >= 200 && response.statusCode! < 300) {
//       return response.data;
//     } else {
//       throw Exception('请求失败，状态码：${response.statusCode}');
//     }
//   }

//   Future<dynamic> put(String url, dynamic data) async {
//     try {
//       final response = await _dio.put(url, data: data);
//       return handleResponse(response);
//     } catch (e) {
//       return handleError(e);
//     }
//   }

//   dynamic handleError(error) {
//     if (error is DioException) {
//       if (error.type == DioExceptionType.connectionTimeout ||
//           error.type == DioExceptionType.receiveTimeout) {
//         throw Exception('网络连接超时');
//       } else if (error.type == DioExceptionType.badResponse) {
//         if (error.response?.statusCode == 401) {
//           TokenManager().removeToken();
//           ToastUtil.showInfo('登录已过期，请重新登录' + '${error.response?.statusCode}');
//           eventBus.fire(LogoutEvent(''));
//         } else {
//           throw Exception('响应错误，状态码：${error.response?.statusCode}');
//         }

//         throw Exception('响应错误，状态码：${error.response?.statusCode}');
//       } else {
//         throw Exception('网络请求错误：$error');
//       }
//     } else {
//       throw Exception('未知错误：$error');
//     }
//   }
// }

// // 导出
// final http = NetworkService();

import 'package:dio/dio.dart';
import 'package:god_logistics/utils/eventbus.dart';
import 'package:god_logistics/utils/showToast.dart';
import 'package:god_logistics/utils/tokenManage.dart';

class NetworkService {
  final _dio = Dio();

  NetworkService() {
    // 配置基础地址
    _dio.options.baseUrl = 'https://slwl-api.itheima.net';
    // 设置连接超时时间
    _dio.options.connectTimeout = const Duration(seconds: 20);
    // 设置接收超时时间
    _dio.options.receiveTimeout = const Duration(seconds: 20);
    // 设置请求头
    _dio.options.headers = {'Content-Type': 'application/json'};
    // 添加请求和响应拦截器
    _addInterceptors();
  }

  // 发起GET请求
  Future<dynamic> get(String url, {Map<String, dynamic>? params}) async {
    try {
      final response = await _dio.get(url, queryParameters: params);
      return handleResponse(response);
    } catch (e) {
      return handleError(e);
    }
  }

  // 发起POST请求
  Future<dynamic> post(String url, dynamic data) async {
    try {
      final response = await _dio.post(url, data: data);
      return handleResponse(response);
    } catch (e) {
      return handleError(e);
    }
  }

  // 发起PUT请求
  Future<dynamic> put(String url, dynamic data) async {
    try {
      final response = await _dio.put(url, data: data);
      return handleResponse(response);
    } catch (e) {
      return handleError(e);
    }
  }

  // 发起DELETE请求
  Future<dynamic> delete(String url) async {
    try {
      final response = await _dio.delete(url);
      return handleResponse(response);
    } catch (e) {
      return handleError(e);
    }
  }

  // 添加拦截器
  void _addInterceptors() {
    _dio.interceptors.add(
      InterceptorsWrapper(
        onRequest: (options, handler) async {
          final tokenManager = TokenManager()..init();
          final token = tokenManager.getToken() ?? '';
          // ToastUtil.showInfo('是否携带token ${token}');
          if (token.isNotEmpty) {
            options.headers['Authorization'] = token;
          }
          return handler.next(options);
        },
        onResponse: (response, handler) {
          return handler.next(response);
        },
        onError: (DioException error, handler) {
          return handler.next(error);
        },
      ),
    );
  }

  // 处理正常响应
  dynamic handleResponse(Response response) {
    if (response.statusCode! >= 200 && response.statusCode! < 300) {
      return response.data;
    } else {
      throw Exception('请求失败，状态码：${response.statusCode}');
    }
  }

  // 处理错误信息
  dynamic handleError(error) {
    if (error is DioException) {
      if (error.type == DioExceptionType.connectionTimeout ||
          error.type == DioExceptionType.receiveTimeout) {
        ToastUtil.showError('网络连接超时');
        throw Exception('网络连接超时');
      } else if (error.type == DioExceptionType.badResponse) {
        if (error.response?.statusCode == 401) {
          TokenManager().removeToken();
          ToastUtil.showInfo('登录已过期，请重新登录');
          eventBus.fire(LogoutEvent(''));
        } else {
          ToastUtil.showError('响应错误，状态码：${error.response?.statusCode}');
          throw Exception('响应错误，状态码：${error.response?.statusCode}');
        }
      } else {
        ToastUtil.showError('网络请求错误：$error');
        throw Exception('网络请求错误：$error');
      }
    } else {
      ToastUtil.showError('未知错误：$error');
      throw Exception('未知错误：$error');
    }
  }
}

// 导出单例
final http = NetworkService();
